package com.example.endusation.stanford;

import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.semgraph.SemanticGraph;
import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations;
import edu.stanford.nlp.util.CoreMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class CoreNlpService {

    // 注入中文 Pipeline Bean（通过 @Qualifier 指定名称，避免多 Bean 冲突）
    private final StanfordCoreNLP chineseCoreNlpPipeline;

    // 构造函数注入（推荐，避免字段注入的耦合问题）
    @Autowired
    public CoreNlpService(@Qualifier("chineseCoreNlpPipeline") StanfordCoreNLP chineseCoreNlpPipeline) {
        this.chineseCoreNlpPipeline = chineseCoreNlpPipeline;
    }

    /**
     * 1. 中文文本分词
     * @param text 原始中文文本（如 "张三在北京大学学习人工智能"）
     * @return 分词结果列表（如 ["张三", "在", "北京", "大学", "学习", "人工智能"]）
     */
    public List<String> chineseTokenize(String text) {
        // 1. 创建 Annotation 对象（CoreNLP 的输入载体）
        Annotation annotation = new Annotation(text);

        // 2. 执行 Pipeline 分析（触发所有配置的 NLP 任务）
        chineseCoreNlpPipeline.annotate(annotation);

        // 3. 提取分词结果（从句子 → 每个 Token 的文本）
        List<String> tokens = new ArrayList<>();
        // 获取所有句子（ssplit 任务的结果）
        List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class);
        for (CoreMap sentence : sentences) {
            // 获取句子中的每个 Token（tokenize 任务的结果）
            for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)) {
                tokens.add(token.get(CoreAnnotations.TextAnnotation.class));
            }
        }
        return tokens;
    }

    /**
     * 2. 中文命名实体识别（NER）
     * @param text 原始中文文本
     * @return 实体列表（键：实体类型，值：实体文本，如 {PERSON: ["张三"], ORGANIZATION: ["北京大学"]}）
     */
    public List<String> chineseNer(String text) {
        Annotation annotation = new Annotation(text);
        chineseCoreNlpPipeline.annotate(annotation);

        // 提取所有实体文本，不分组
        return annotation.get(CoreAnnotations.SentencesAnnotation.class).stream()
                .flatMap(sentence -> sentence.get(CoreAnnotations.TokensAnnotation.class).stream())
                // 过滤非实体（"O"表示无实体）和可能的null标签
                .filter(token -> {
                    String nerTag = token.get(CoreAnnotations.NamedEntityTagAnnotation.class);
                    return nerTag != null && !"O".equals(nerTag);
                })
                // 只收集实体文本
                .map(token -> token.get(CoreAnnotations.TextAnnotation.class))
                // 转换为列表
                .collect(Collectors.toList());
    }



    /**
     * 3. 中文依存句法分析
     * @param text 原始中文文本
     * @return 每个句子的依存句法树（以字符串形式展示，便于查看）
     */
    public List<String> chineseDependencyParse(String text) {
        Annotation annotation = new Annotation(text);
        chineseCoreNlpPipeline.annotate(annotation);

        List<String> dependencyTrees = new ArrayList<>();
        for (CoreMap sentence : annotation.get(CoreAnnotations.SentencesAnnotation.class)) {
            // 获取依存句法树（depparse 任务的结果）
            SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class);
            // 转换为字符串（便于打印或存储）
            dependencyTrees.add(graph.toString(SemanticGraph.OutputFormat.LIST));
        }
        return dependencyTrees;
    }
}
